﻿#include <iostream>
using namespace std;
//
//class Adult //基类
//{
//public:
//	virtual void BuyTicket()
//	{
//		cout << "全价票" << endl;
//	}
//};
//
//class Student : public Adult //派生类
//{
//public:
//	virtual void BuyTicket()
//	{
//		cout << "学生票" << endl;
//	}
//};
//
//class Soldier : public Adult
//{
//public:
//	virtual void BuyTicket()
//	{
//		cout << "军人票" << endl;
//	}
//};
//
//void Ticket(Adult& pa) //基类的指针或引用
//{
//	pa.BuyTicket();
//}
//
//int main()
//{
//	
//	Student st; //派生类对象
//	Soldier so; //派生类对象
//	Ticket(st);
//	Ticket(so);
//
//
//	//Adult a;   //基类对象
//	//Student s; //派生类对象
//	//Ticket(a);
//	//Ticket(s);
//
//
//	return 0;
//}

//class A
//{
//public:
//	virtual void func(int val = 1) { std::cout << "A->" << val << std::endl; }
//	virtual void test() { func(); }
//};
//class B : public A
//{
//public:
//	void func(int val = 0) { std::cout << "B->" << val << std::endl; }
//};
//
//int main()
//{
//	B* p = new B;
//	p->test();
//	return 0;
//}

//class A {};
//class B : public A {};
//class Person
//{
//public:
//    virtual Person* BuyTicket()
//    {
//        cout << "买票-全价" << endl;
//        return nullptr;
//    }
//};
//
//class Student : public Person {
//public:
//    virtual Student* BuyTicket()
//    {
//        cout << "买票-打折" << endl;
//        return nullptr;
//    }
//};
//
//void Func(Person* ptr)
//{
//    ptr->BuyTicket();
//}
//
//int main()
//{
//    Person ps;
//    Student st;
//    Func(&ps);
//    Func(&st);
//    return 0;
//}

//class A
//{
//public:
//	virtual ~A()
//	{
//		cout << "~A()" << endl;
//	}
//};
//class B : public A {
//public:
//	~B()
//	{
//		cout << "~B()->delete:" << _p << endl;
//		delete _p;
//	}
//protected:
//	int* _p = new int[10];
//};
//// 只有派⽣类Student的析构函数重写了Person的析构函数，下⾯的delete对象调⽤析构函数，才能
////构成多态，才能保证p1和p2指向的对象正确的调⽤析构函数。
//int main()
//{
//	A* p1 = new A;
//	A* p2 = new B;
//	delete p1;
//	delete p2;
//	return 0;
//}

//class Car 
//{
//public:
//	virtual void Dirve()
//	{
//	}
//};
//class Benz :public Car {
//public:
//	virtual void Drive() override { cout << "Benz-舒适" << endl; }
//};
//int main()
//{
//	return 0;
//}

//class Car
//{
//public:
//	virtual void Drive()  = 0;
//};
//class Benz :public Car
//{
//public:
//	virtual void Drive() { cout << "Benz" << endl; }
//};
//int main()
//{
//	Car* pBenz = new Benz;
//	pBenz->Drive();
//	
//	return 0;
//}

//class A
//{
//public:
//	bool same(int a, int b)
//	{
//		return a == b;
//	}
//	bool test()
//	{
//		
//	}
//};
//
//
//class B
//{
//public:
//	bool same(int a, int b)
//	{
//		return a == b;
//	}
//	bool test()
//	{
//
//	}
//};
//
//int main()
//{
//
//	return 0;
//}
// 
// 
// 
// 
//class Base
//{
//public:
//	virtual void Func1()
//	{
//		cout << "Func1()" << endl;
//	}
//	virtual void Func2()
//	{
//		cout << "Func2()" << endl;
//	}
//	void Func3()  //不是虚函数
//	{
//		cout << "Func3()" << endl;
//	}
//protected:
//	int _b = 1;
//	char _ch = 'x';
//};
//
//int main()
//{
//	Base b;
//	cout << sizeof(b) << endl;
//	return 0;
//}


class Person {
public:
	virtual void BuyTicket() { cout << "买票-全价" << endl; }
private:
	string _name;
};
class Student : public Person {
public:
	virtual void BuyTicket() { cout << "买票-打折" << endl; }
private:
	string _id;
};
class Soldier : public Person {
public:
	virtual void BuyTicket() { cout << "买票-优先" << endl; }
private:
	string _codename;
};


// 虽然都是Person指针Ptr在调⽤BuyTicket
// 但是跟ptr没关系，⽽是由ptr指向的对象决定的
void Func(Person* ptr)
{
	ptr->BuyTicket();
}
int main()
{
	// 其次多态不仅仅发⽣在派⽣类对象之间，多个派⽣类继承基类，重写虚函数后
	// 多态也会发⽣在多个派⽣类之间。
	Person ps;
	Student st;
	Soldier sr;
	Func(&ps);
	Func(&st);
	Func(&sr);


	return 0;
}

